package showgo.gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JDialog;
import javax.swing.JOptionPane;

import showgo.modell.Manager;
import showgo.modell.stueck.Rolle;
import showgo.modell.stueck.Stueck;

/**
 * GUI zur Verwaltung von Rollen in einem Stueck; Hier koennen Alter und
 * Geschlecht einer Rolle zugewiesen werden;
 * 
 * @author lutz
 * 
 */
public class RollenDialog extends JDialog implements ActionListener,
	KeyListener, MouseListener, ItemListener {

    /**
     * 
     */
    private static final long serialVersionUID = -6981106850021855654L;

    Rolle rolle2Edit = null;

    private Stueck stueck;

    int index = 0;

    private List<Rolle> rollen = new ArrayList<Rolle>();

    private javax.swing.JLabel alterLabel;
    private javax.swing.JTextField alterTextField;
    private javax.swing.JLabel rollenNameLabel;
    private javax.swing.JTextField rollennameTextField;
    private javax.swing.JButton aufloesenButton;
    private javax.swing.JButton werteUebernehmenButton;
    private javax.swing.JButton beendenButton;
    @SuppressWarnings("rawtypes")
    private javax.swing.JComboBox geschlechtComboBox;
    private javax.swing.JLabel geschlechtLabel;
    private javax.swing.JScrollPane jScrollPane1;
    private RollenTable rollenJTable;

    public RollenDialog(Stueck stueck) {
	super();

	this.rollen = stueck.getRollen();
	this.stueck = stueck;

	setModal(true);
	setTitle("Rollen verwalten");
	initComponents();
	JOptionPane.showMessageDialog(null,
		"Bitte Alter und Geschlecht\nder einzelnen Rollen überprüfen.");
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    private void initComponents() {

	setPreferredSize(new java.awt.Dimension(850, 400));
	// DialogFrame kann nicht maximiert werden
	setResizable(false);

	rollenJTable = new RollenTable();
	rollenJTable.addMouseListener(this);
	rollenJTable.addKeyListener(this);

	jScrollPane1 = new javax.swing.JScrollPane();
	jScrollPane1.setViewportView(rollenJTable);

	rollennameTextField = new javax.swing.JTextField();
	rollennameTextField.setEditable(false);

	rollenNameLabel = new javax.swing.JLabel();

	alterTextField = new IntegerTextField(false);

	alterLabel = new javax.swing.JLabel();

	geschlechtComboBox = new javax.swing.JComboBox();
	geschlechtComboBox.addItem(this);

	geschlechtLabel = new javax.swing.JLabel();

	beendenButton = new javax.swing.JButton();
	beendenButton.addActionListener(this);

	rollenNameLabel.setFont(new java.awt.Font("Tahoma", 1, 12));
	rollenNameLabel.setText("Rollenname");

	alterLabel.setFont(new java.awt.Font("Tahoma", 1, 12));
	alterLabel.setText("Alter");

	geschlechtComboBox.setModel(new javax.swing.DefaultComboBoxModel(
		new String[] { "maennlich", "weiblich" }));

	geschlechtLabel.setFont(new java.awt.Font("Tahoma", 1, 12));
	geschlechtLabel.setText("Geschlecht");

	beendenButton.setFont(new java.awt.Font("Tahoma", 1, 12));
	beendenButton.setText("Beenden");

	aufloesenButton = new javax.swing.JButton();
	aufloesenButton.addActionListener(this);
	aufloesenButton.setFont(new java.awt.Font("Tahoma", 1, 12));
	aufloesenButton.setText("Auflösen");

	werteUebernehmenButton = new javax.swing.JButton();
	werteUebernehmenButton.addActionListener(this);
	werteUebernehmenButton.setFont(new java.awt.Font("Tahoma", 1, 12));
	werteUebernehmenButton.setText("");

	javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
		getContentPane());
	getContentPane().setLayout(layout);
	layout.setHorizontalGroup(layout
		.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
		.addGroup(
			layout.createSequentialGroup()
				.addContainerGap()
				.addGroup(
					layout.createParallelGroup(
						javax.swing.GroupLayout.Alignment.LEADING)
						.addComponent(jScrollPane1)
						.addGroup(
							layout.createSequentialGroup()
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.LEADING)
										.addComponent(
											rollennameTextField,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											160,
											javax.swing.GroupLayout.PREFERRED_SIZE)
										.addComponent(
											rollenNameLabel,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											98,
											javax.swing.GroupLayout.PREFERRED_SIZE))
								.addPreferredGap(
									javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.LEADING)
										.addComponent(
											alterTextField,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											35,
											javax.swing.GroupLayout.PREFERRED_SIZE)
										.addComponent(
											alterLabel))
								.addGap(45, 45,
									45)
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.LEADING)
										.addGroup(
											layout.createSequentialGroup()
												.addComponent(
													geschlechtLabel)
												.addPreferredGap(
													javax.swing.LayoutStyle.ComponentPlacement.RELATED,
													javax.swing.GroupLayout.DEFAULT_SIZE,
													Short.MAX_VALUE)
												.addComponent(
													aufloesenButton,
													javax.swing.GroupLayout.PREFERRED_SIZE,
													149,
													javax.swing.GroupLayout.PREFERRED_SIZE))
										.addGroup(
											layout.createSequentialGroup()
												.addComponent(
													geschlechtComboBox,
													javax.swing.GroupLayout.PREFERRED_SIZE,
													javax.swing.GroupLayout.DEFAULT_SIZE,
													javax.swing.GroupLayout.PREFERRED_SIZE)
												.addGap(34,
													34,
													34)
												.addComponent(
													werteUebernehmenButton,
													javax.swing.GroupLayout.PREFERRED_SIZE,
													149,
													javax.swing.GroupLayout.PREFERRED_SIZE)
												.addPreferredGap(
													javax.swing.LayoutStyle.ComponentPlacement.RELATED,
													182,
													Short.MAX_VALUE)
												.addComponent(
													beendenButton,
													javax.swing.GroupLayout.PREFERRED_SIZE,
													149,
													javax.swing.GroupLayout.PREFERRED_SIZE)))))
				.addContainerGap()));
	layout.setVerticalGroup(layout
		.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
		.addGroup(
			layout.createSequentialGroup()
				.addContainerGap()
				.addComponent(jScrollPane1,
					javax.swing.GroupLayout.PREFERRED_SIZE,
					250,
					javax.swing.GroupLayout.PREFERRED_SIZE)
				.addPreferredGap(
					javax.swing.LayoutStyle.ComponentPlacement.RELATED,
					204, Short.MAX_VALUE)
				.addGroup(
					layout.createParallelGroup(
						javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
							javax.swing.GroupLayout.Alignment.TRAILING,
							layout.createSequentialGroup()
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.BASELINE)
										.addComponent(
											rollenNameLabel)
										.addComponent(
											alterLabel)
										.addComponent(
											geschlechtLabel))
								.addPreferredGap(
									javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.BASELINE)
										.addComponent(
											rollennameTextField,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											javax.swing.GroupLayout.DEFAULT_SIZE,
											javax.swing.GroupLayout.PREFERRED_SIZE)
										.addComponent(
											alterTextField,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											javax.swing.GroupLayout.DEFAULT_SIZE,
											javax.swing.GroupLayout.PREFERRED_SIZE)
										.addComponent(
											geschlechtComboBox,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											javax.swing.GroupLayout.DEFAULT_SIZE,
											javax.swing.GroupLayout.PREFERRED_SIZE))
								.addGap(26, 26,
									26))
						.addGroup(
							javax.swing.GroupLayout.Alignment.TRAILING,
							layout.createSequentialGroup()
								.addComponent(
									aufloesenButton,
									javax.swing.GroupLayout.PREFERRED_SIZE,
									40,
									javax.swing.GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(
									javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.BASELINE)
										.addComponent(
											beendenButton,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											40,
											javax.swing.GroupLayout.PREFERRED_SIZE)
										.addComponent(
											werteUebernehmenButton,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											40,
											javax.swing.GroupLayout.PREFERRED_SIZE))
								.addContainerGap()))));

	pack();
	fillTable();
    }

    private void fillTable() {
	if (rollen.size() > 0) {
	    rollenJTable.setModel(new RollenTableModel());
	    for (int i = 0; i < rollen.size(); i++) {
		rollenJTable.addRolle(rollen.get(i));
	    }
	}
    }

    @Override
    public void itemStateChanged(ItemEvent arg0) {

    }

    @Override
    public void mouseClicked(MouseEvent e) {
	// bei Doppelklick auf eine Zeile in der Tabelle die Daten des
	// zugehoerigen Elements in den Eingabefeldern anzeigen
	if (e.getClickCount() == 2) {
	    int row = rollenJTable.rowAtPoint(e.getPoint());
	    this.index = row;
	    rolle2Edit = rollenJTable.getRolleAt(row);
	    if (rolle2Edit != null) {
		loadElement(rolle2Edit);
	    }
	    werteUebernehmenButton.setText("übernehmen");
	    alterTextField.requestFocusInWindow();
	}
    }

    private void loadElement(Rolle rolle) {
	alterTextField.setText("");
	rollennameTextField.setText(rolle.getRollenName());
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {

    }

    @Override
    public void mouseExited(MouseEvent arg0) {

    }

    @Override
    public void mousePressed(MouseEvent arg0) {

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
	if (e.getSource() == rollenJTable) {
	    if (e.getKeyCode() == KeyEvent.VK_DELETE) {
		if (stueck.getName().contains("Kopie")
			|| stueck.getName().contains("-")) {
		    int ret = JOptionPane.showConfirmDialog(null,
			    "Wollen Sie diese Rolle wirklich entfernen?",
			    "Warnung", JOptionPane.YES_NO_OPTION,
			    JOptionPane.QUESTION_MESSAGE);
		    if (ret == JOptionPane.OK_OPTION) {
			entferneRolle();
		    }
		} else {
		    JOptionPane
			    .showMessageDialog(null,
				    "Aus einem Originalstueck koennen keine Rollen entfernt werden!");
		}
	    }
	}
    }

    private void entferneRolle() {
	int selectedRowIndex = rollenJTable.getSelectedRow();
	if (selectedRowIndex > -1) {
	    // Rolle, die zu loeschen ist;
	    Rolle rolle = rollen.get(rollenJTable.getSelectedRow());
	    // Rolle aus Stueck entfernen;
	    Manager.getInstance().entferneRolleAusStueck(rolle, stueck);
	    Manager.getInstance().entferneRolleAusInszenierung(rolle, stueck);
	    fillTable();
	}
    }

    @Override
    public void keyReleased(KeyEvent arg0) {

    }

    @Override
    public void keyTyped(KeyEvent arg0) {

    }

    @Override
    public void actionPerformed(ActionEvent e) {
	// die geladene Rolle wird um die eingegebenen Werte aktualisiert;
	if (e.getSource() == werteUebernehmenButton) {
	    // erst Kontrolle, ob auch ein valider Wert fuer das Alter
	    // eingegeben wurde:
	    if (alterIstGueltig()) {
		rolle2Edit.setAlter(Integer.valueOf(alterTextField.getText()));
		rolle2Edit.setGeschlecht(geschlechtComboBox.getSelectedItem()
			.toString());
		editiereRolle(rolle2Edit);
		alterTextField.setText("");
		fillTable();
	    }
	} else if (e.getSource() == beendenButton) {
	    if (eingabeIstVollstaendig()) {
		// Rollen setzen
		stueck.setRollen(rollen);

		dispose();
	    } else {
		JOptionPane
			.showMessageDialog(null,
				"Bitte erst für alle Rollen Alter und Geschlecht eingeben!");
	    }
	} else if (e.getSource() == aufloesenButton) {
	    // Rolle aus Liste aufloesen
	    if (rollenJTable.getSelectedRow() > -1) {
		int ret = JOptionPane.showConfirmDialog(null,
			"Wollen Sie diese Rolle auflösen?", "Warnung",
			JOptionPane.YES_NO_OPTION);
		if (ret == JOptionPane.YES_OPTION) {
		    rolle2Edit = rollenJTable.getRolleAt(rollenJTable
			    .getSelectedRow());
		    List<Rolle> rollen2Edit = new ArrayList<Rolle>();
		    rollen2Edit.add(rolle2Edit);

		    PseudoRollenDialog pseudoRollenDialog = new PseudoRollenDialog(
			    rollen2Edit, rollen, "Rolle auflösen", stueck);
		    pseudoRollenDialog.setModal(true);
		    pseudoRollenDialog.setVisible(true);
		    fillTable();
		}
	    }
	}
    }

    private boolean eingabeIstVollstaendig() {
	// true, wenn bei allen Rollen ein Alter und ein Geschlecht vergeben
	// wurde
	for (int i = 0; i < rollen.size(); i++) {
	    if (rollen.get(i).getAlter() == 0
		    || rollen.get(i).getGeschlecht().equals("unbekannt")) {
		return false;
	    }
	}
	return true;
    }

    private boolean alterIstGueltig() {
	if (alterTextField.getText().isEmpty()) {
	    JOptionPane.showMessageDialog(null, "Bitte Alter eingeben!");
	    return false;
	} else if (Integer.valueOf(alterTextField.getText()) > 100) {
	    JOptionPane.showMessageDialog(null,
		    "Bitte geben Sie einen Wert < 100 ein!");
	    return false;
	}
	return true;
    }

    /**
     * @param rolle
     *            Die geladene Rolle wird um die eingegebenen Werte
     *            aktualiesiert. Diese Werte werden mit dem Parameter Rolle
     *            uebergeben.
     */
    private void editiereRolle(Rolle rolle) {
	// uebergebene Rolle finden
	if (!rollen.isEmpty()) {
	    for (int i = 0; i < rollen.size(); i++) {
		if (rollen.get(i).getRollenName().equals(rolle.getRollenName())) {
		    // neue Werte aus RollenDialog setzen
		    rollen.get(i).setAlter(rolle.getAlter());
		    rollen.get(i).setGeschlecht(rolle.getGeschlecht());
		}
	    }
	}
    }
}
